import { url } from '../config';
import globalStore from '../store/global.js';
import userInfo from '../store/userInfo.js';
const { baseUrl } = url;

/**
 * 上传文件（支持表单数据和文件混合上传）
 * @param {string} url - 请求URL
 * @param {Object} data - 表单数据（包含文件）
 * @param {Object} [options] - 可选配置
 * @returns {Promise}
 */
export function uploadFile(url, data, options = {}) {
  const fullUrl = `${baseUrl}${url}`;
  const token = globalStore.getToken();
  
  return new Promise((resolve, reject) => {
    // 图片处理
    if (data.reportImg && Array.isArray(data.reportImg) && data.reportImg.length > 0) {
      const reportImages = data.reportImg;
      // 确保imgname是字符串，处理可能存在的引号问题
      let imgname = '';
      if (data.imgname) {
        if (typeof data.imgname === 'string') {
          imgname = data.imgname;
        } else if (Array.isArray(data.imgname)) {
          imgname = data.imgname.join('');
        } else {
          imgname = String(data.imgname);
        }
      }
      
      const uploadTasks = [];
      
      // 遍历所有图片进行上传
      reportImages.forEach((filePath, index) => {
        // 构建表单数据
        const formDataObj = {};
        
        // 添加基本字段
        if (data.reporttype) formDataObj.reporttype = data.reporttype;
        if (data.reportreason) formDataObj.reportreason = data.reportreason;
        if (data.contactsphone) formDataObj.contactsphone = data.contactsphone;
        
        // 处理图片名称，添加索引使每张图片名称唯一
        formDataObj.imgname = `${imgname}_${index}`;
        // 当前上传的是第几张图片
        formDataObj.currentIndex = index;
        // 总共有多少张图片
        formDataObj.totalImages = reportImages.length;
        
        // 处理复杂对象：Spring的@ModelAttribute需要将对象属性以扁平化形式传递
        if (data.kyyPostReportEntity) {
          // 将复杂对象的每个属性展平到表单中
          for (const key in data.kyyPostReportEntity) {
            if (key === 'image' && Array.isArray(data.kyyPostReportEntity.image)) {
              // 处理image数组
              formDataObj['kyyPostReportEntity.image'] = JSON.stringify(data.kyyPostReportEntity.image);
            } else {
              formDataObj[`kyyPostReportEntity.${key}`] = data.kyyPostReportEntity[key];
            }
          }
        }
        
        if (data.kyyCommentReportEntity) {
          // 将复杂对象的每个属性展平到表单中
          for (const key in data.kyyCommentReportEntity) {
            formDataObj[`kyyCommentReportEntity.${key}`] = data.kyyCommentReportEntity[key];
          }
        }
        
        // 添加认证信息
        formDataObj.token = token;
        
        console.log(`准备上传第${index + 1}张图片:`, filePath, '表单数据:', formDataObj);
        
        // 创建上传任务
        const uploadTask = new Promise((resolveTask, rejectTask) => {
          uni.uploadFile({
            url: fullUrl,
            filePath: filePath,
            name: 'reportImg', // 与后端MultipartFile参数名匹配
            formData: formDataObj,
            header: {
              'Authorization': token,
              'Content-Type': 'multipart/form-data'
            },
            success(res) {
              try {
                console.log(`第${index + 1}张图片上传成功，服务器响应:`, res.data);
                const data = JSON.parse(res.data);
                resolveTask(data);
              } catch (err) {
                console.error(`第${index + 1}张图片解析响应出错:`, err, res.data);
                rejectTask({
                  error: err,
                  message: '服务器响应格式错误',
                  index
                });
              }
            },
            fail(err) {
              console.error(`第${index + 1}张图片上传失败:`, err);
              rejectTask({
                error: err,
                message: '网络请求失败',
                index
              });
            }
          });
        });
        
        uploadTasks.push(uploadTask);
      });
      
      // 等待所有上传任务完成
      Promise.all(uploadTasks)
        .then(results => {
          console.log('所有图片上传完成:', results);
          
          // 检查是否有任何一个请求返回了非0状态码
          const errorResult = results.find(result => result.code !== 0);
          
          if (errorResult) {
            if (errorResult.code === 401) {
              // 处理登录失效逻辑
              uni.clearStorageSync('islogin');
              globalStore.clearTokenAndLoginType();
              userInfo.clearUserInfo();
              reject(errorResult.message);
            } else {
              uni.showToast({
                title: errorResult.msg || '部分图片上传失败',
                icon: 'none'
              });
              reject(errorResult.message);
            }
          } else {
            resolve({
              code: 0,
              data: results.map(r => r.data),
              msg: '全部图片上传成功'
            });
          }
        })
        .catch(error => {
          console.error('图片上传过程中出现错误:', error);
          uni.showToast({
            title: '图片上传失败',
            icon: 'none'
          });
          reject(error);
        });
    } else {
      // 没有图片时，构建表单数据
      const formData = {};
      
      // 添加基本字段
      if (data.reporttype) formData.reporttype = data.reporttype;
      if (data.reportreason) formData.reportreason = data.reportreason;
      if (data.contactsphone) formData.contactsphone = data.contactsphone;
      
      // 处理复杂对象
      if (data.kyyPostReportEntity) {
        // 将复杂对象的每个属性展平到表单中
        for (const key in data.kyyPostReportEntity) {
          if (key === 'image' && Array.isArray(data.kyyPostReportEntity.image)) {
            // 处理image数组
            formData['kyyPostReportEntity.image'] = JSON.stringify(data.kyyPostReportEntity.image);
          } else {
            formData[`kyyPostReportEntity.${key}`] = data.kyyPostReportEntity[key];
          }
        }
      }
      
      if (data.kyyCommentReportEntity) {
        // 将复杂对象的每个属性展平到表单中
        for (const key in data.kyyCommentReportEntity) {
          formData[`kyyCommentReportEntity.${key}`] = data.kyyCommentReportEntity[key];
        }
      }
      
      // 添加认证信息
      formData.token = token;
      
      console.log('准备发送的表单数据:', formData);
      
      // 使用普通POST请求
      uni.request({
        url: fullUrl,
        method: 'POST',
        data: formData,
        header: {
          'content-type': 'application/x-www-form-urlencoded',
          'Authorization': token
        },
        success(res) {
          console.log('请求成功，响应:', res.data);
          if (res.data.code === 0) {
            resolve(res.data);
          } else if (res.data.code === 401) {
            uni.clearStorageSync('islogin');
            globalStore.clearTokenAndLoginType();
            userInfo.clearUserInfo();
            reject(res.data.message);
          } else {
            uni.showToast({
              title: res.data.msg || '请求失败',
              icon: 'none'
            });
            reject(res.data.message);
          }
        },
        fail(err) {
          console.error('请求失败:', err);
          uni.showToast({
            title: '网络请求失败',
            icon: 'none'
          });
          reject(err);
        }
      });
    }
  });
}
